<!DOCTYPE HTML>
<html lang="zh-CN">


<head>
    <meta charset="utf-8">
    <meta name="keywords" content="Mathematica——模式，规则1, 我心永恆的小站">
    <meta name="description" content="">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="renderer" content="webkit|ie-stand|ie-comp">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <!-- Global site tag (gtag.js) - Google Analytics -->


    <title>Mathematica——模式，规则1 | 我心永恆的小站</title>
    <link rel="icon" type="image/png" href="/favicon.png">

    <link rel="stylesheet" type="text/css" href="/libs/awesome/css/all.css">
    <link rel="stylesheet" type="text/css" href="/libs/materialize/materialize.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/aos/aos.css">
    <link rel="stylesheet" type="text/css" href="/libs/animate/animate.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/lightGallery/css/lightgallery.min.css">
    <link rel="stylesheet" type="text/css" href="/css/matery.css">
    <link rel="stylesheet" type="text/css" href="/css/my.css">

    <script src="/libs/jquery/jquery.min.js"></script>
    <link rel="stylesheet" href="/css/vs2015.css">

<meta name="generator" content="Hexo 4.2.0"><link rel="alternate" href="/atom.xml" title="我心永恆的小站" type="application/atom+xml">
</head>


<body>
    <header class="navbar-fixed">
    <nav id="headNav" class="bg-color nav-transparent">
        <div id="navContainer" class="nav-wrapper container">
            <div class="brand-logo">
                <a href="/" class="waves-effect waves-light">
                    
                    <img src="/medias/logo.png" class="logo-img" alt="LOGO">
                    
                    <span class="logo-span">我心永恆的小站</span>
                </a>
            </div>
            

<a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a>
<ul class="right nav-menu">
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/" class="waves-effect waves-light">
      
      <i class="fas fa-home" style="zoom: 0.6;"></i>
      
      <span>首页</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/tags" class="waves-effect waves-light">
      
      <i class="fas fa-tags" style="zoom: 0.6;"></i>
      
      <span>标签</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/categories" class="waves-effect waves-light">
      
      <i class="fas fa-bookmark" style="zoom: 0.6;"></i>
      
      <span>分类</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/archives" class="waves-effect waves-light">
      
      <i class="fas fa-archive" style="zoom: 0.6;"></i>
      
      <span>归档</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/about" class="waves-effect waves-light">
      
      <i class="fas fa-user-circle" style="zoom: 0.6;"></i>
      
      <span>关于</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/contact" class="waves-effect waves-light">
      
      <i class="fas fa-comments" style="zoom: 0.6;"></i>
      
      <span>留言板</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/friends" class="waves-effect waves-light">
      
      <i class="fas fa-address-book" style="zoom: 0.6;"></i>
      
      <span>友情链接</span>
    </a>
    
  </li>
  
  <li>
    <a href="#searchModal" class="modal-trigger waves-effect waves-light">
      <i id="searchIcon" class="fas fa-search" title="搜索" style="zoom: 0.85;"></i>
    </a>
  </li>
</ul>

<div id="mobile-nav" class="side-nav sidenav">

    <div class="mobile-head bg-color">
        
        <img src="/medias/logo.png" class="logo-img circle responsive-img">
        
        <div class="logo-name">我心永恆的小站</div>
        <div class="logo-desc">
            
            Never really desperate, only the lost of the soul.
            
        </div>
    </div>

    

    <ul class="menu-list mobile-menu-list">
        
        <li class="m-nav-item">
	  
		<a href="/" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-home"></i>
			
			首页
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/tags" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-tags"></i>
			
			标签
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/categories" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-bookmark"></i>
			
			分类
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/archives" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-archive"></i>
			
			归档
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/about" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-user-circle"></i>
			
			关于
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/contact" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-comments"></i>
			
			留言板
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/friends" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-address-book"></i>
			
			友情链接
		</a>
          
        </li>
        
        
    </ul>
</div>

        </div>

        
    </nav>

</header>

    



<div class="bg-cover pd-header post-cover" style="background-image: url('/medias/featureimages/14.jpg')">
    <div class="container" style="right: 0px;left: 0px;">
        <div class="row">
            <div class="col s12 m12 l12">
                <div class="brand">
                    <h1 class="description center-align post-title">Mathematica——模式，规则1</h1>
                </div>
            </div>
        </div>
    </div>
</div>




<main class="post-container content">

    
    <link rel="stylesheet" href="/libs/tocbot/tocbot.css">
<style>
    #articleContent h1::before,
    #articleContent h2::before,
    #articleContent h3::before,
    #articleContent h4::before,
    #articleContent h5::before,
    #articleContent h6::before {
        display: block;
        content: " ";
        height: 100px;
        margin-top: -100px;
        visibility: hidden;
    }

    #articleContent :focus {
        outline: none;
    }

    .toc-fixed {
        position: fixed;
        top: 64px;
    }

    .toc-widget {
        width: 345px;
        padding-left: 20px;
    }

    .toc-widget .toc-title {
        margin: 35px 0 15px 0;
        padding-left: 17px;
        font-size: 1.5rem;
        font-weight: bold;
        line-height: 1.5rem;
    }

    .toc-widget ol {
        padding: 0;
        list-style: none;
    }

    #toc-content {
        height: calc(100vh - 250px);
        overflow: auto;
    }

    #toc-content ol {
        padding-left: 10px;
    }

    #toc-content ol li {
        padding-left: 10px;
    }

    #toc-content .toc-link:hover {
        color: #42b983;
        font-weight: 700;
        text-decoration: underline;
    }

    #toc-content .toc-link::before {
        background-color: transparent;
        max-height: 25px;
    }

    #toc-content .is-active-link {
        color: #42b983;
    }

    #toc-content .is-active-link::before {
        background-color: #42b983;
    }

    #floating-toc-btn {
        position: fixed;
        right: 15px;
        bottom: 76px;
        padding-top: 15px;
        margin-bottom: 0;
        z-index: 998;
    }

    #floating-toc-btn .btn-floating {
        width: 48px;
        height: 48px;
    }

    #floating-toc-btn .btn-floating i {
        line-height: 48px;
        font-size: 1.4rem;
    }
</style>
<div class="row">
    <div id="main-content" class="col s12 m12 l9">
        <!-- 文章内容详情 -->
<div id="artDetail">
    <div class="card">
        <div class="card-content article-info">
            <div class="row tag-cate">
                <div class="col s7">
                    
                    <div class="article-tag">
                        
                            <a href="/tags/%E6%95%99%E7%A8%8B/">
                                <span class="chip bg-color">教程</span>
                            </a>
                        
                            <a href="/tags/Mathematica/">
                                <span class="chip bg-color">Mathematica</span>
                            </a>
                        
                    </div>
                    
                </div>
                <div class="col s5 right-align">
                    
                </div>
            </div>

            <div class="post-info">
                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-minus fa-fw"></i>发布日期:&nbsp;&nbsp;
                    2020-03-14
                </div>
                

                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-check fa-fw"></i>更新日期:&nbsp;&nbsp;
                    2020-03-25
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-file-word fa-fw"></i>文章字数:&nbsp;&nbsp;
                    9.8k
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-clock fa-fw"></i>阅读时长:&nbsp;&nbsp;
                    40 分
                </div>
                

                
                    <div id="busuanzi_container_page_pv" class="info-break-policy">
                        <i class="far fa-eye fa-fw"></i>阅读次数:&nbsp;&nbsp;
                        <span id="busuanzi_value_page_pv"></span>
                    </div>
				
            </div>

        </div>
        <hr class="clearfix">
        <div class="card-content article-card-content">
            <div id="articleContent">
                <!-- wp:html -->
<style>
p {font-size:18px;}
</style>
<!-- /wp:html -->

<!-- wp:mdx/warning {"title":"写在前面的话","content":"本次的mma教程，有以下改进：1.代码的输入和结果分开 2.提供了在线运行，不过速度很慢。3.其他小改动"} -->
<blockquote class="wp-block-mdx-warning mdx-warning"><p><i class="mdui-icon material-icons"></i> 写在前面的话<br/><strong>本次的mma教程，有以下改进：1.代码的输入和结果分开 2.提供了在线运行，不过速度很慢。3.其他小改动</strong></p></blockquote>
<!-- /wp:mdx/warning -->

<!-- wp:heading -->
<h2>1.1介绍</h2>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 在这一章中，我们将 在Mathematica 中介绍函数的概念，并考虑许多函数的例子。由于Mathematica编程语言在很大程度上是一种<strong>函数式编程语言</strong>，因此函数是本文的<strong>中心对象</strong>。此外，由于列表被用作数据结构的通用构建块，任何复杂的数据结构都可以用列表构建并“动态地”修改，因此与面向对象编程语言相比，重点更多地转向了函数。 </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> Mathematica中函数和函数式编程的<strong>另一个重要方面</strong>是，这个编程的<strong>“层”</strong>是建立在一个(在我看来，Mathematica中更基本的)基于规则的引擎之上的。这就产生了函数的概念，它比大多数其他编程语言更广泛，也有很大的不同。因此，如果不了解规则和基于规则的编程技巧，就不可能完全掌握Mathematica中的函数。我们也将在这里讨论这一话题。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>1.2Rule（规则）和patten（模式）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 为了更好地理解Mathematica中的函数，我们需要对模式和规则替换有很好的理解。这两个主题仅仅是一个主题的两个方面，因为模式的形式决定了<strong>关联规则作用在哪个对象类上</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>1.2.1 Rule, RuleDelayed, Replace和ReplaceAll命令 </h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.1基本规则和Rule的Head</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 在Mathematica中组织一个<strong>重写规则</strong>是非常容易的。例如，下面的规则将把a替换为</p>
<!-- /wp:paragraph -->

<!-- wp:group -->
<div class="wp-block-group"><div class="wp-block-group__inner-container"><!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">[wlcode]Clear[a, b, rule];[/wlcode]</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">[wlcode]a -&gt; b[/wlcode]</p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:group -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpRRyFJR6GoNCc11poLRCnYKiQq6NopJP3//1@3oCgzrwQA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 与箭头(表示规则)对应的文字是rule命令。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 如果如果我们用FullForm查看rule的结构，我们会发现rule的Head（头部）是Rule.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>FullForm[rule]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>Rule[a,b]</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.2  应用规则 ：用ReplaceAll函数  </h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 我们定义的任何规则<strong>本身都不能做任何有用的事情</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">命令规则本身只是规则左右两边的命名容器。当与另一个命令结合使用时，它就变得非常有用了， 该命令在表达式中执行规则替换。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这个命令有一个格式 <strong>ReplaceAll[expr, rules] </strong>和一个简写符号:<strong>expr/.rules。</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">当我们我们应用多个规则，它们通常应该放在一个<strong>简单的(而不是嵌套的)列表</strong>中，稍后我们将看到这样的例子。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">如果规则被放置在一个嵌套的列表中，Mathematica将以不同的方式解释它们</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 下面就是我们的规则在表达式上的工作方式 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[f, a, b, rule];
rule = a -> b;
f[a] /. rule</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>f[b]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpNRyFRRyFJR6GoNCc11poLRCnYKiQq6NopJFlzpUUnxiro64Fl////r1tQlJlXAgA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">或者这样也可以</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>f[a]/.a->b</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>f[b]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 如果我们有一个更复杂的表达式，其中a不止出现了一次， 当我们使用/.时 ，它将在<strong>所有地方被替换</strong>，或ReplaceAll命令替换</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[f, g, h];
f[a, g[a], g[a, h[a]]] /. a -> b</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>f[b, g[b], g[b, h[b]]]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpNRyFdRyEj1porLToRyI5OjAWTQDEgMzZWQV9PIVFB104h6f///7oFRZl5JQA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.3 ReplaceAll在表达式上的规则的顺序 </h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 规则应用程序通常从<strong>较大的表达式</strong>开始。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">如果它作为一个<strong>整体匹配，</strong>则不检查子表达式是否有进一步的匹配。当模式看起来像h[x_]或类似的时候就是这样。例如，在这种情况下 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[a, q];
{{{a}}} /. {x_} :> q[x]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>q[{{a}}]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpRR6Ew1pqruro6sba2VkFfT6G6Ir5WwcpOoTC6Ivb///@6BUWZeSUA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:mdx/warning {"title":"说明","content":"上面的代码看起来似乎不是很清楚， 我来解释一下，首先看这个x_，这个x先不要管。你先看这个_符号，这个符号_的右边没有东西就表示头部是任意表达式的表达式。这里的x只是一个符号可以是任何mma表达式，那么x_代表的意思就是：头部为任意表达式的表达式。然后{x_}就代表{任意表达式}，那么替换{x_}:\u003eq[x]就代表{一些东西}替换成q[一些东西]，在这里的一些东西是{{a}}，所以最后输出为q[{{a}]]"} -->
<blockquote class="wp-block-mdx-warning mdx-warning"><p><i class="mdui-icon material-icons"></i> 说明<br/><strong>上面的代码看起来似乎不是很清楚， 我来解释一下，首先看这个x_，这个x先不要管。你先看这个_符号，这个符号_的右边没有东西就表示头部是任意表达式的表达式。这里的x只是一个符号可以是任何mma表达式，那么x_代表的意思就是：头部为任意表达式的表达式。然后{x_}就代表{任意表达式}，那么替换{x_}:>q[x]就代表{一些东西}替换成q[一些东西]，在这里的一些东西是{{a}}，所以最后输出为q[{{a}]]</strong></p></blockquote>
<!-- /wp:mdx/warning -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 我们可以多次应用该规则，将所有列表中的所有括号替换为q[]. </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{{{a}}} /. {x_} :> q[x] /. {x_} :> q[x]
{{{a}}} /. {x_} :> q[x] /. {x_} :> q[x] /. {x_} :> q[x]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>q[q[{a}]]
q[q[q[a]]]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6ujqxtrZWQV9PoboivlbByk6hMLoiFp3PRaQ6dP7///91C4oy80oA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在这里pattern是一个List。现在说起来有点模糊，先不要着急。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{{{a}}} /. List -> q</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>q[q[q[a]]]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6ujqxtrZWQV9PwSezuERB106h8P///7oFRZl5JQA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 这种操作很符合逻辑，当我们需要多个不用的替换的时候，我们可以用一些技巧来处理，后面我们会说到这个。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.4规则的结合律</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 正如前面的例子所说的，规则的应用是<strong>左关联</strong>的，这意味着表达式 expr /.规则1 /.规则2 是合法的，首先将<strong>规则1</strong>应用于 expr ，然后将规则2应用于得到的结果 .</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.5规则的位置</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 需要说明的是，像上面这样的规则是<strong>局部的</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这意味着，当规则重写其应用于其他对象的对象时，它将<strong>更改该对象的副本</strong>，而<strong>初始对象保持不变</strong>。在上面的例子中，表达式f[a]没有变化 。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 这是<strong>规则和执行类似转换的函数之间的主要区别</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在后一种情况中，类似的规则是<strong>全局定义</strong>的(这意味着内核将自动尝试以交互方式输入的任何表达式，或者以其他方式计算)。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">本质上，这是Mathematica中<strong>函数和规则列表之间唯一的基本区别</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">例如，我们可以通过局部规则轻松地模拟平方函数 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[f];
{f[x], f[y], f[something], f[10]} /. f[x_] :> x^2</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{x^2, y^2, something^2, 100}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDot1pqrOi26IlZHIS26EkwW5@emlmRk5qWDeYYGsbUK@npAVkV8rIKVnUJFnNH///91C4oy80oA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.6用RuleDelayed函数自定义规则</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 我用这个例子介绍了两个新概念。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">第一，我们在规则的左侧有一个模式——它们用于<strong>扩大规则</strong>，将应用到相应的对象。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">第二，我们使用了一种新的规则(只有两个规则，其中一个我们以前已经考虑过了)，即使用:&gt;符号代替-&gt;符号。它的字面等价是RuleDelayed[lhs,rhs]命令 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>RuleDelayed[a, b]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>a :> b</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 我们通过名称可以猜到的，这对应于一个延迟的规则替换。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">也就是说，规则的r.h.s.（right hand side赋值操作的右侧）（说白了就是等式的右侧）是在<strong>规则替换发生之后才计算</strong>，也就是说<strong>先替换，再计算！</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">稍后我们将详细讨论<strong>规则或RuleDelayed更合适的情况</strong>，但是一般情况下，这里的情况与使用Set和SetDelayed赋值操作符的情况类似。这种相似性并不是偶然的，而是再次反映了Mathematica中的赋值运算符只是创建<strong>全局规则的运算符</strong>这一事实。 </p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.1.7Rule(规则)和RuleDelayed（延迟规则）的区别举例。</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 为了举例说明Rule和RuleDelayed在一个特定示例中的区别。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">考虑这样的一个问题:给定一个元素列表，将符号 a 的每次出现都替换为一个随机数。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[sample, a, b, c, d, e, f, g];
sample = {a, b, d, e, g, f, c, b, a, d}
(*下面我们分别用\[Rule]和\[RuleDelayed]操作*)
sample /. a -> Random[]
sample /. a :> Random[]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{0.741878, b, d, e, g, f, c, b, 0.741878, d}
{0.14384, b, d, e, g, f, c, b, 0.160757, d}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKLo4MbcgJ1VHIVFHIUlHIVlHIUVHAchN01FIj7Xmgsgq2CpUQ@Qhkulg@WSwCFA8pZZLQ@vJju6Xcxc965j4ZPeapx1tTztWP5@yIiY6qDQnNfbppB4IyyU1J7EyNSX22eTeJ3vnaGnCzNfXU0hU0LVTCErMS8nPjY5FEbdCiP///1@3oCgzrwQA" target="_blank" rel="noopener">在</a><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKLo4MbcgJ1VHIVFHIUlHIVlHIUVHAchN01FIj7Xmgsgq2CpUQ@Qhkulg@WSwCFA8pZZLQ@vJju6Xcxc965j4ZPeapx1tTztWP5@yIiY6qDQnNfbppB4IyyU1J7EyNSX22eTeJ3vnaGlyBRRl5pVA3aCgr6eQqKBrpxCUmJeSnxsdG4tF2gpJ@v///7oFIBUA" target="_blank" rel="noopener">线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 我们看到</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">第一种情况下的<strong>数字是相同的</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">而第二种情况下的<strong>数字是不同的</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这是因为</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在第一种情况下，规则的r.h.s（右边）.在<strong>应用之前已经被计算过了，而且是一次性的。</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在第二种情况下，<strong>每次应用规则时都要重新评估规则的r.h.s</strong>.。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">下面我再给一个例子</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[n, t, sample, a, b, c, d, e, f, g];
n = 1;
t = 1;
sample = {a, b, d, e, g, f, c, b, a, d};
(*下面我们分别用\[Rule]和\[RuleDelayed]操作*)
sample /. a -> {a, n++}
sample /. a :> {a, t++}</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{{a, 1}, b, d, e, g, f, c, b, {a, 1}, d}

{{a, 1}, b, d, e, g, f, c, b, {a, 2}, d}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpPR6FER6E4MbcgJ1VHIVFHIUlHIVlHIUVHAchN01FIj7XmylOwVTC05iqBUBC1QHY1RDVEaTpYdTJYBCieUmvNpaH1ZEf3y7mLnnVMfLJ7zdOOtqcdq59PWRETHVSakxr7dFIPhOWSmpNYmZoS@2xy75O9c7Q0uQKKMvNKoqHW6OspJCro2oEty9PWro3FIm0FkS4BSf///1@3AKQCAA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>1.2.2规则替换没有交换律</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":4} -->
<h4>1.2.2.1 规则的列表</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 当我们在一个表达式上使用<strong>多个规则</strong>时，我们将这些规则放到一个列表中。例如 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{a, b, c, d} /. {a -> 1, b -> 2, c -> 3}</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>
{1, 2, 3, d}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786UUchSUchWUchpVZBX0@hOlFB107BECgIoo2AMiDauPb///@6BUWZeSUA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<p class="is-style-text-indent-2em"> 对于要在表达式上使用的所有规则，规则列表必须是<strong>平面列表</strong>（类似与这种{something}，这种就不行{{something1},{something2}}），也就是说，所有列表元素都应该有一个head规则或RuleDelayed。</p>


<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->

<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">嵌套的规则列表来替换或ReplaceAll并没有错错误，而是被解释为我们想要在原始表达式的几个副本上分别尝试规则的所有子列表 。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">举个例子来说明一下嵌套列表：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{a, b, c, d} /. {{a -> 1, b -> 2, c -> 2}, {a -> 1}, {c -> 2, d -> 3}}</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{{1, 2, 2, d}, {1, b, c, d}, {a, b, 2, 3}}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786UUchSUchWUchpVZBX0@hujpRQddOwRAoCqKNgFJgulZHASoDYiVD5VJAtHFt7f///3ULijLzSgA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.2.2 没有交换律</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 规则替换的结果通常取决于<strong>规则在列表中的顺序</strong>，如下面的示例所示。 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[a, f];
f[a] /. {a -> 5, a -> 7}
f[a] /. {a -> 1, a -> 4}</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>f[5]
f[1]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpRRyEt1porLToxVkFfT6E6UUHXTsFURwFMm9fq6wcUZeaVoMkbQuVNYPL////XLQAxAA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">mma这样做的原因是，一旦某个规则被应用到表达式的给定部分，<strong>ReplaceAll就会转到表达式的下一部分</strong>，<strong>并尝试下一部分的规则</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">但是，即使我们多次运行ReplaceAll，对于列表中规则的不同排序，结果通常仍然是不同的。这是因为<strong>一旦一个规则应用到一个(部分)表达式上，这个部分通常会被重写</strong>，这样我们之前应用的规则列表中的一些规则将不再适用，反之亦然。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在任何情况下，我们的最终结论是规则应用程序不是可交换的，规则列表中的规则顺序通常很重要。对于这方面的一个极端示例，我们将很快考虑一个基于规则的阶乘函数，其中不同的规则排序将导致<strong>无限迭代</strong></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>1.2.3 规则和计算过程之间的相互作用 </h3>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 在Mathematica中，需要注意的是我们从来没有真正从Head（头部）开始，而是始终使用一个<strong>大型的内置规则系统</strong>，将内置函数连接在一起。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这为使用这些函数提供了很大的灵活性，因为可以使用用户定义的规则操作或覆盖这些系统规则。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">另一方面，必须小心的是，因为用户新定义的规则(或函数定义和变量赋值，它们是全局规则)立即开始与内置规则交互。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.3.1 当规则被应用时，表达式被计算</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">作为第一个例子我们考虑伽马函数：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Clear[a];
Gamma[a]
Gamma[a] /. a -> 2</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>Gamma[a]
1</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDox1prLPTE3NxHI0tcPKMrMK4HzFfT1FBIVdO0UjKAy////1y0AMQA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 在上面的例子中由于系统不知道a是什么，所以与gamma函数相关的任何规则都不适用，只是返回输入。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">当我们用规则替换a-&gt;2的时候， 我们可以看到，一旦数值(整数)被替换，就会应用一个内建规则来产生结果。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">与此同时,对于派这个数，没有规则迫使Mathematica计算数值,因此不会计算出来。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Gamma[a] /. a -> Pi</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>Gamma[\[Pi]]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/989MTc3MToxVkFfTyFRQddOISDz////ugVFmXklAA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 如果我们想在这种情况下计算这个数值，我们可以这样做 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Gamma[a] /. a -> N[Pi]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>2.28804</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">或者这样也可以</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>N[Gamma[a] /. a -> Pi]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>2.28804</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">事实上，在某些情况下，我可能希望保持Gamma[5]函数的<strong>未求值形式。</strong>更一般地说，使用基于规则的方法的优点是，我们不需要为我们想要描述的新情况添加规则。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这并不是说Mathematica的计算是不可预测的，而是说我们编写的程序不应该依赖于那些纯粹由惯例定义的特性。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">特别的，在Mathematica中，我们应该总是假设所有的表达式都可以求值为其他的东西。因此，如果某个表达式必须在一段时间内保持未求值，那么程序员必须处理它。另一方面，如果某个表达式必须被完全求值(例如，一个数值)，程序员必须再次确保它。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.3.2  规则的适用性影响的评估</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">考虑这样的一个例子</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{f[Pi], Sin[Pi], Pi^2}
{{f[Pi], Sin[Pi], Pi^2}} /. Pi -> a</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{f[\[Pi]], 0, \[Pi]^2}
{{f[a], 0, a^2}}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786LTogM1ZHITgzD8IIyIwzqtXXDyjKzCvhqsYuXaugrwdkKejaKSRClf7//1@3AMQAAA" target="_blank" rel="noopener">在线运行</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在上面的代码的第二个，当我们应用Pi-&gt;a这个规则的时候，我们会很自然的认为应该是以Sin[a]出现，而不是以0输出。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">为什么会这样？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">我们曾经说过/.只是ReplaceAll的缩写！，我们把这个完整的写出来。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>RepalceAll[{f[Pi], Sin[Pi], Pi^2}, Pi -> a]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{{f[a], 0, a^2}} </code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 现在我们回想一下Mathematica中的计算法则，<strong>子表达式</strong>通常在表达式<strong>之前进行计算</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这意味着当计算过程到达ReplaceAll命令的时候，我们的表达式就已经转换为与第一个输入的输出相同的形式(没有规则替换之前的形式)。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在没有用ReplaceAll命令之前，Sin[Pi]的值为0，由于0不再包含Pi，因此不符合规则，所以表达式的这一部分没有进一步的替换。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">另外，我们可以通过使用<strong>Trace</strong>命令查看计算过程</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Trace[{{f[Pi], Sin[Pi], Pi^2}} /. Pi -> a]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{{{{Sin[\[Pi]],0},{f[\[Pi]],0,\[Pi]^2}},{{f[\[Pi]],0,\[Pi]^2}}},{\[Pi]->a,\[Pi]->a},{{f[\[Pi]],0,\[Pi]^2}}/. \[Pi]->a,{{f[a],0,a^2}}}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在线运行</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这些示例可能会给人一种印象，即Mathematica在与规则排序相关的方面是有bug的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">虽然Mathematica程序中的许多重要bug确实与这个问题有关，但也有一些方法可以避免它们。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">只要规则或规则列表总是正确的，它们要么表示精确的恒等式(例如，数学恒等式)，要么可以确保在没有实际情况下，单独使用它们不会导致错误的结果，就应该没有问题。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">当被认为“正确”的规则在某些不可预见的情况下给出了不正确的结果时，bug就会发生，但是对于在更传统的编程范例中编写的程序也是如此。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">也许，真正的区别在于，对于更传统的编程技术，通常更容易将程序限制在问题参数空间的“角落”中，在那里可以预测或证明正确的性能。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">我个人认为，规则排序所引起的复杂性是(可能不可避免的)为使用一种非常普遍的评估方法而付出的代价。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>1.2.4 规则和简单(不受限制的)模式</h3>
<!-- /wp:heading -->

<!-- wp:group -->
<div class="wp-block-group"><div class="wp-block-group__inner-container"><!-- wp:html -->
</p>
<h4>1.2.4.1 一个最简单的模式和一般的模式匹配的策略</h4>
<p>
<!-- /wp:html -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">之前我们已经见过最简单的模式 是一个下划线 _ ，它的文字表示是Blank[] 。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>Blank[]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>_</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><strong>这个模式表示任何Mathematica表达式</strong>。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">现在我们用最简单的模式去替换任何元素。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"> </p>
<p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":445,"sizeSlug":"large"} -->
</p>
<figure class="wp-block-image size-large"><img class="wp-image-445" src="http://wxyh.rinue.top/wp-content/uploads/2020/02/KW@CV5A7D1C28@F6G.png" alt="" /></figure>
<p>
<!-- /wp:image -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">这不是很令人很愉快的事情。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">我们的整个表达式(列表)匹配这个模式，然后被滑稽图片替换。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">在我们继续之前，让我解释一下模式是如何工作的，以及为什么基于模式的替换是可能的。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">其主要内容是用符号树统一表示Mathematica表达式。基本上，当我们试图将某个无论多么复杂的模式与某个表达式匹配时，我们是在<strong>匹配两棵Tree（树）</strong>。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">表示模式的Tree（树）也是一个合法的Mathematica表达式(模式和其他任何东西一样是Mathematica表达式)，但是用一些特殊的符号(如空格[](下划线)替换了一些分支或叶子。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>FullForm[(_^_) Sin[_]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>Times[Power[Blank[],Blank[]],Sin[Blank[]]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">如果表达式 expr 和expr 的某些部分是相同的模，那么这个模式树(或者只是模式)将匹配这些表达式expr</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">特别地，上面的模式将匹配的表达式是这样的：</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><strong>某个表达式1^某个表达式2 *Sin[某个表达式3]</strong></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">说的有点绕，我们看下面的例子。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{某个表达式1^某个表达式2*Sin[某个表达式3], 某个东西1^某个东西3, s, 
  Sin[某个东西3]} /. (_^_) Sin[_] -&gt; 滑稽</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{滑稽,某个东西1^某个东西3,s,Sin[某个东西3]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7/62fwJT3aserFwxYt9@57u6TeMQxMw0grOzItGEzSO1VGACD3ZMefF0v0wXRCesY5CsY4Cl4ICQidUIrZWQV9PQSM@Ll4TLBkfq6Brp/Bs98TnK/b@//9ft6AoM68EAA" target="_blank" rel="noopener">在线运行</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
</p>
<h4>1.2.4.2 MatchQ函数检验模式匹配</h4>
<p>
<!-- /wp:heading -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><strong>MatchQ</strong> 非常有用的命令，它允许检查给定表达式和给定模式之间是否存在匹配。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">它接受一个表达式和一个模式作为参数，当模式匹配时返回True，否则返回False。例如</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>MatchQ[(fja)^fjka*Sin[jkj], (_^_) Sin[_]]
MatchQ[Exp[-x^2]^2 *Sin[Cos[x - y]^2], (_^_) Sin[_]]
MatchQ[x*Sin[j], (_^_) Sin[_]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>True
True
False</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/983sSQ5IzBaIy0rUTMuLSs7USs4My86KzsrVkdBIz4uXlMBxI@PjdXXDyjKzCvhgmpwrSiI1q2IM4qNM1IAa3HOL46uUNBVqASKENBbAbEDh6r////rFoAYAA" target="_blank" rel="noopener">在线运行</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">重要的是要理解模式匹配(对于简单的或不受限制的模式)完全基于所匹配表达式的语法，而不是 表面形式。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
</p>
<h4>1.2.4.3 模式的标记（名字）和表达式的解构</h4>
<p>
<!-- /wp:heading -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">现在，虽然确定某个表达式与某个模式匹配的事实有一定的价值，但是当我们访问这个表达式中与模式的某些部分匹配的部分时，它就变得更加有用了，这样我们就可以进一步处理这些部分。这称为表达式解构，是一个非常强大的与模式相关的功能。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">例如，在上面的例子中，我们可能想知道哪个表达式是正弦的基、幂和辐角。但是为了能够进行这样的破坏，我们需要以某种方式标记模式的各个部分。这可以通过模式标记(或名称)的机制实现:我们将一些符号附加到模式部分，然后这个符号存储匹配的实际表达式的相应部分，以供进一步处理。例如，我们可以插入标签在我们的模式:</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:mdx/warning {"title":"说明","content":"说白了就是给模式加一个名字，原来是用 _  表示的，现在为了更好的说明情况以后后面一些数据的处理，在 _ 加一个名称以便更好地处理问题。 "} -->
</p>
<blockquote class="wp-block-mdx-warning mdx-warning">
<p><i class="mdui-icon material-icons"></i> 说明<br /><strong>说白了就是给模式加一个名字，原来是用 _ 表示的，现在为了更好的说明情况以后后面一些数据的处理，在 _ 加一个名称以便更好地处理问题。 </strong></p>
</blockquote>
<p>
<!-- /wp:mdx/warning -->

<!-- wp:code -->
</p>
<pre><code>(base_^pwr_)*Sin[sinarg_];
MatchQ[(fja)^fjka*Sin[jkj], (base_^pwr_)*Sin[sinarg_]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>True</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/18jKbE4NT6uoLwoXlMrODMvujgzL7EoPT7Wmss3sSQ5IzBaIy0rUTMuLSs7ESyflZ0Vq6OAU1vs////dQuKMvNKAA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">模式标记不能是<strong>复合表达式</strong>，只能是<strong>真正</strong>的符号(Head为symbol的)。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">模式标记的存在并不会以任何方式改变匹配，它只会给我们<strong>提供额外的信息</strong>。我们不会通过MatchQ获得这个信息，因为MatchQ只是建立了匹配的事实。为此，我们需要一个真正的规则应用程序，因为规则将告诉我们如何处理这些匹配(子)表达式。例如，这里我们将简单地将它们收集到一个列表中</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{符号^符号2*Sin[a], 
  Exp[-x^2]^3*Sin[Cos[x + y^2*Tan[x]]]} /. (base_^pwr_)*
   Sin[sinarg_] -&gt; {base, pwr, sinarg}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{{符号, 符号2, a}, {E, -3 x^2, Cos[x + y^2 Tan[x]]}}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7/6@ZplT/u3x0EoI63gzLzoxFgdBS4FBdeKgmjdijij2DhjsLBzfnF0hYK2QmWckVZIYl50RWxsbK2Cvp6CRlJicWp8XEF5UbymFlCjAkh1cWZeYlF6fKyCrp1CNUiBjgJQgY4CRLz2////ugVFmXklAA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">我们刚刚做的就是一个特殊的破坏案例。我们标记的部件现在可以用于我们想要执行的任何操作。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">总结:</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">每当一个模式包含一个部分是一个特殊的符号像空白[]，可能附有标签模式,这意味着实际的表达式匹配可以包含在这个地方,而任意子表达式(任意,取决于所使用的特定的特殊符号)。然而，不包含这些符号的部分，必须以完全相同的方式出现在模式和表达式中，以使它们匹配。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">关于模式标记更重要的一点是，<strong>模式不同部分中的两个相同的模式标记(符号)不能代表我们试图匹配的表达式中不同的对应子表达式</strong>。例如:</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>MatchQ[a^a, b_^b_]
MatchQ[m^p, c_^c_]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>True
False</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/983sSQ5IzA6MS5RRyEpPi4pPlZfP6AoM6@ECyqTG1ego5AcH5cMl/n//79uAYgBAA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
</p>
<p>
<!-- /wp:heading -->

<!-- wp:heading {"level":4} -->
</p>
<h4>1.2.4.4小例子：固定一个参数的函数</h4>
<p>
<!-- /wp:heading -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">下面的模式适用于每个函数，但是参数必须是x</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>Clear[f, x];
f_[x]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">例如，当我们需要在x 作为某个函数的单个参数出现的每个地方用某个值，比如10 替换它时，可以使用它。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>Clear[f, x];
f_[x];
{x, Sin[x], Exp[2 x], x^2, f[x, y], Cos[y]} /. f_[x] -&gt; f[10]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[10], E^(2 x), x^2, f[x, y], Cos[y]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/985JzWxKDpNR6Ei1porLT4aRFVX6CgEZ@YB2ToKrhUF0UYKIFZFnJGOQlo0UK4SyHPOL46ujK1V0NdTAOtS0LUDShoaxP7//1@3oCgzrwQA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">替换只发生在列表的第二个元素中。要理解这一点，我们必须回想一下Mathematica表达式的树状本质，以及规则应用程序是基于<strong>表达式语法</strong>而不是<strong>语义的</strong>。让我们来看看这些表达的完整形式</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], Exp[2 x], x^2, f[x, y], Cos[y]} // FullForm</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>List[x,Sin[x],Power[E,Times[2,x]],Power[x,2],f[x,y],Cos[y]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">我们看到,只有第二个列表元素包含x 为单个参数,接下来的几个有两个参数(因此模式不匹配),下一个有3个参数,最后一个有一个参数,但y不是 x .</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
</p>
<h4>1.2.4.5 有两个参数的函数，但第一个参数是固定的</h4>
<p>
<!-- /wp:heading -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">首先，让我们构建一个规则，它将对具有两个参数的元素起作用</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], 
  Cos[y]} /. {f_[x, z_] -&gt; f[10, z]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], 100, 10 y, 10 + y, g[y, x], h[x, y, z], Cos[y]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqIJtLQcE5vzi6MrZWQV9PoTotHiRXFR@roGunkBZtaABSVfv//3/dgqLMvBIA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">我们看到一个新的模式是f_[x, z_]，它表示两个参数的任意函数，第二个参数是任意的，但是第一个参数固定为x 。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">注意，没有对g[y,x]进行替换，因为这里虽然有两个参数，但是第一个参数不是x。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">一般来说,对于简单的模式,来确定是否一个给定的模式将匹配一个给定的表达式是考虑的FullForm模式和表达,和模式表达式是否有空白的地方它不同于表达式匹配。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">上面模式的完整形式是 ：</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>f_[x, z_] // FullForm</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>Pattern[f,Blank[]][x,Pattern[z,Blank[]]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">为了更好地理解上面的模式是如何匹配我们列表中的表达式的，我们可以构造一个不同的规则，它将告诉我们匹配了哪些部分 ：</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], 
  Cos[y]} /. {f_[x, z_] -&gt; {{"f is", f}, {"z is", z}}}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{x,Sin[x],{{f is,Power},{z is,2}},{{f is,Times},{z is,y}},{{f is,Plus},{z is,y}},g[y,x],h[x,y,z],Cos[y]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##JYoxDoMwEAT7vGLlkpgg5QFpeEJKy0EWwsEFJAoujE/39uNQmt1ZzS4hz9MSchqDCBWLZ1pd8Rbldddodg1cofV2J6uZnd6Uq/IF6D@b2z2ju4HicLo6eLQPEJmItBmLyBZk6n9UZhaR9vtLaz4A" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">回到我们之前的2个参数函数的规则，让我们首先修复g[y, x]项的问题，使它也匹配。我们的解决方案是添加另一个规则，从而创建一个替换规则列表</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], 
  Cos[y]} /. {f_[x, z_] -&gt; f[10, z], f_[z_, x] -&gt; f[z, 10]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], 100, 10 y, 10 + y, g[y, 10], h[x, y, z], Cos[y]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##JYs5DoMwFER7TjE1MesBaDhCyi9jWVEAFywKLowRZ//5Fs3M0yyL9fN3sd59LPMVFN5upaAVwtCK5KcIXhCbKLE0M8lMOApnQL8ddOobVYlrNKmLRqPoMFJTPyuJo0nnJ44KTa1vZi72n1v9Hw" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
</p>
<h4>1.2.4.6将一个两个三个参数的情况结合起来</h4>
<p>
<!-- /wp:heading -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">现在，让我们改变规则，在Sin[x]中也会发生替换。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">也就是说，现在我们希望 x 在一个或两个参数的函数中被替换。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], 
  Cos[y]} /. {f_[x] :&gt; f[10], f_[x, y_] :&gt; f[10, y], 
  f_[z_, x] :&gt; f[z, 10]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[10], 100, 10 y, 10 + y, g[y, 10], h[x, y, z], Cos[y]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqIJtLQcE5vzi6MrZWQV9PoTotHqhXwcpOIS3a0AAoDeID1cbDxYAciC6gTFU8yDyITJWOAlBD7f///3ULijLzSgA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">最后，我们想添加一个规则来包含一个包含3个变量的函数</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], 
  Cos[y]} /. {f_[x] :&gt; f[10], f_[x, y_] :&gt; f[10, y], 
  f_[z_, x] :&gt; f[z, 10], f_[x, y_, z_] :&gt; f[10, y, z]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{x, Sin[10], 100, 10 y, 10 + y, g[y, 10], h[10, y, z], Cos[y]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqIJtLQcE5vzi6MrZWQV9PoTotHqhXwcpOIS3a0AAoDeID1cbDxYAciC6gTFU8yDyITJWOAooGoOkomkC21f7//1@3oCgzrwQA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
</p>
<h4>1.2.4.7新模式——建立块，空白序列，和一个小警告。</h4>
<p>
<!-- /wp:heading -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">现在让我介绍另一个模式—类似于Blank[]的构建块，它简化了许多模式的构建。这个新模式对象的文字命令是BlankSequence[]。它的字面等价是一个双下划线符号_ _</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>BlankSequence[ ]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>__</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/98pJzEvOzi1sDQ1Lzk1WiH2////ugVFmXklAA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">此模式元素用于表示表达式中<strong>一个或多个元素</strong>的序列。例如</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{g[x, y, z], g[q, m], h[x]} /. g[t__] :&gt; {t}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{{x, y, z}, {q, m}, h[x]}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786PbpCR6FSR6EqVkchPbpQRyEXyMiIroitVdDXA4qUxMfHKljZKVSX1P7//1@3oCgzrwQA" target="_blank" rel="noopener">Try it online!</a></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">由于这种模式构建块允许创建匹配更广泛的表达式类的模式，因此有时我们可能会得到我们不希望得到的结果。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">例如，在这里，我们希望向列表中的所有函数添加一个a作为额外的参数 :</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{g[x, y, z], g[q, m], h[x]} /. f_[t__] :&gt; f[t, a]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>{g[x, y, z], g[q, m], h[x], a}</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786PbpCR6FSR6EqVkchPbpQRyEXyMiIroitVdDXU0iLjy6Jj49VsLJTSIsu0VFIjP3//79uQVFmXgkA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">这里的a被加到列表中去了，不是我们想要的，为什么会这样？。我们用FullForm函数看清它的本质。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:code -->
</p>
<pre><code>{g[x, y, z], g[q, m], h[x]} // FullForm</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:code -->
</p>
<pre><code>List[g[x,y,z],g[q,m],h[x]]</code></pre>
<p>
<!-- /wp:code -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">我们看到head（头部）为列表匹配f_ (表示任意head（头部）)， t__匹配于列表的内部，因为它确实是<strong>一个由三个元素组成的序列</strong>—— g 和 g ，h。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">因此，a 被作为最后一个参数添加到我们的函数列表中，而不是添加到列表中的每个函数中。我们看到我们的规则比我们想要的高1级,<strong>应用于整个表达式而不是部分表达式</strong>。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">这是使用ReplaceAll时的常见情况。<strong>在这种情况下，规则首先在较大的表达式上尝试</strong>，如果它们匹配，规则将应用于它们，<strong>而不再尝试子表达式</strong>。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em">有几种方法可以改变这种行为。</p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><strong>一种方法是创建受限制的模式，使它们更具选择性。</strong></p>
<p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
</p>
<p class="is-style-text-indent-2em"><strong>另一种方法是使用Replace命令，它以不同的顺序执行规则替换 </strong></p>
<p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:group -->

<p><!-- /wp:group --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4>1.2.4.8 有条件限制的模式</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">如果选择第一种方法，则必须修改模式，使头列表不匹配。我们想要做的是强加一个条件，即f 中的模式 f 与List不相同。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{g[x, y, z], h[x, y]} /. f_[t__] /; f =!= List -&gt; f[t, a]</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{g[x, y, z, a], h[x, y, a]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786PbpCR6FSR6EqVkchA8yOrVXQ11NIi48uiY@PVdC3VkhTsFW0VfDJLC5R0LVTSIsu0VFIjP3//79uQVFmXgkA" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4>1.2.4.9 使用Replace代替ReplaceAll</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">如果我们选择使用Replace命令，这里有一种方法可以做到这一点</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>Replace[{g[x, y, z], h[x, y]}, f_[t__] :&gt; f[t, a], 1]</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{g[x, y, z, a], h[x, y, a]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/z8otSAnMTk1ujo9ukJHoVJHoSpWRyEDzI6t1VFIi48uiY@PVbCyU0iLLtFRSATKGsb@//9ft6AoM68EAA" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">Replace和ReplaceAll的区别在于：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><strong>Replace允许我们指定必须应用规则的表达式级别</strong>（“层”）。这样可以更详细地控制规则的应用。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">例如，在这里，我们要求规则只应用于级别1，这意味着列表子表达式的级别，函数g和 h</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">另一个方法是,我们可以表明该规则适用于整个表达式,我们可以通过使用Replace[expr,rules,Infinity]的顺序规则将应用不同ReplaceAll:现在的规则将应用在深度-第一个方式,从最小的(内部)大(外部)的子表达式。这种行为通常是首选的，然后必须使用Replace。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4>1.2.4.10 Rule中的规则，一个更好的解决方案</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">考虑我们最初的问题， 有这么多规则来描述一般情况的一些特殊情况是相当不方便的:每当 x 是某个函数的一个参数时，在该函数中将其更改为&lt; 10 &gt;。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">让我们看看能否写出这个问题的更简明、更一般的解。我建议的方法需要BlankSequence。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"> </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:mdx/progress {"progress":"100"} --></p>
<div class="wp-block-mdx-progress mdui-progress">
<div class="mdui-progress-determinate" style="width: 100%;"> </div>
</div>
<p><!-- /wp:mdx/progress --></p>
<p><!-- wp:paragraph {"customFontSize":18,"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em" style="font-size: 18px;"><em> <strong>说</strong></em><strong><em>明表达结构：</em></strong></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">为了说明它是如何工作的，我们现在将创建一个规则，根据这个模式“解构”我们的表达式</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
 f_[t__] /; f =!= List -&gt; {{"function", f}, {"arguments"，{t}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{x, {{"function", Sin}, {{"arguments" ， x}}}, {{"function", 
   Power}, {{2 "arguments" ， x}}}, {{"function", 
   Times}, {{"arguments" ， x y}}}, {{"function", 
   Plus}, {{"arguments" ， x y}}}, {{"function", 
   g}, {{"arguments" ， x y}}}, {{"function", 
   h}, {{"arguments" ， x y z}}}, {{"function", 
   Cos}, {{"arguments" ， y}}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##FYqxDoIwFEV3v@LaUYskrgYXVzfHpjYNodCBQuCRgE3/wE/yn/yE@lzOPcm5vaWu6S352uYcV4mHD2rVEuvzzDhsDBzB06q/c@kU39hf7LdhVptOKE/YwRlFxmiUFzhU@wp3PxOKK2IUbgk1@SEICZckorBTu/RNoFl8P@9IKaWcczFOPtAP" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">我使用带限制条件f=!=List的原因是：这样的话 整个列表将匹配，因为它的元素与模式_ _匹配 .</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
 f_[t__] -&gt; {{"function", f}, {"arguments", {t}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{{"function", 
  List}, {"arguments", {x, Sin[x], x^2, x y, x + y, g[y, x], 
   h[x, y, z], Cos[y]}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##FYpBDsIgFET3nmLCUmlNPIAbj@DyBwlpSssCatrfhEo4O/1u3rzMTHQ8j9FxGFxrJWu8Q6JsNPLnIbgeAtwgMdHfZZlJbuI/8dey0WEq7j0u8JbYWoPuiVKU39PAYUlKw1eNotw67XFMvElTuNbaWuu@a0h8Ag" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">我们稍后将讨论受限制的模式，因为现在只将它看作带有特定条件的模式。与此同时，这个示例本身表明，在定义模式时必须小心，因为在比我们预期的外的情况下可以匹配。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"customFontSize":18,"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em" style="font-size: 18px;"><strong><em>解决我们的问题</em></strong></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">回到我们最初的问题，这里有一个解决方案:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
 f_[t__] /; f =!= List :&gt; (f[t] /. x -&gt; 10)</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[10], 100, 10 y, 10 + y, g[y, 10], h[10, y, z], Cos[y]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##FYqxDoJAEAV7v@LZKYIgpQQaWzvLzXm5GA6uAIxscUj89nVp5k3yZnDct4Pj8HIia0zxCCNFkyI@S0WyKHCCTkeb69OTZupf9ds002J@yM/YwVtiaw3yCh71vsY9zIxrg4MnNlsTkTW4FEcRyd6fMPIf" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"customFontSize":18,"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em" style="font-size: 18px;"><em><strong>解释：</strong></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:mdx/fold {"title":"step1：使用括号设置正确的优先级","isOpen":false} --></p>
<div class="wp-block-mdx-fold mdui-panel mdui-panel-gapless">
<div class="mdui-panel-item">
<div class="mdui-panel-item-header">
<div class="mdui-panel-item-title">step1：使用括号设置正确的优先级</div>
<p><i class="mdui-panel-item-arrow mdui-icon material-icons">keyboard_arrow_down</i></p>
</div>
<div class="mdui-panel-item-body"> </div>
</div>
</div>
<p><!-- /wp:mdx/fold --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">这个解决方案在几个方面都很出色。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">首先，我们在整个规则中使用了一个外部规则，在括号中使用了内部规则。它的意思是:一旦我们发现任何与“第一”(或“外部”)规则的模式匹配的内容，就根据“第二”或“内部”规则<strong>立即</strong>替换该表达式。第一个(“外部”)规则在这里充当第二个(“内部”)规则的过滤器。如果我们省略括号，就得不到想要的结果:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
  f_[t__] /; f =!= List :&gt; f[t] /. x -&gt; 10</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{10, Sin[10], 100, 10 y, 10 + y, g[y, 10], h[10, y, z], Cos[y]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##FYq7DoJAEEV7v@LaIg@11EBDS0c5WTcb48oWPAJTLBC/fRyac09yT@@4@/SOw9uJ7DFFGwaKJkV83RXJqsAFOl86XJ@ONFPf1OtxodX8UOQ4Ad4SW2tQPOFRnks0YWE8KnhiczQRWYXbVUSyaQ4D/wE" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">发生这种情况的原因是：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">规则应用程序是左关联的。因此，第一个规则首先被应用，并且基本上是空闲的，因为它本身只说f_[t__] /;f = != List:&gt; f[t]，即用自身替换此形式的表达式</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>step1 = {x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
  f_[t__] /; f =!= List :&gt; f[t]</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x y, x + y, g[y, x], h[x, y, z], Cos[y]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">第二个规则应用于step1 ，它说:当 x 发生时，用10 替换x 。因此，例如，列表的第一个元素，它只是 x ，<strong>不是任何函数的参数</strong>，也被替换了。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>step1 /. x -&gt; 10</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{10, Sin[10], 100, 10 y, 10 + y, g[y, 10], h[10, y, z], Cos[y]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">但是，如果使用括号，则可以确保第二个规则实际应用于第一个规则“过滤”的结果</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:mdx/fold {"title":"step2：使用RuleDelayed为内部规则提供正确的参数","content":"","isOpen":false} --></p>
<div class="wp-block-mdx-fold mdui-panel mdui-panel-gapless">
<div class="mdui-panel-item">
<div class="mdui-panel-item-header">
<div class="mdui-panel-item-title">step2：使用RuleDelayed为内部规则提供正确的参数</div>
<p><i class="mdui-panel-item-arrow mdui-icon material-icons">keyboard_arrow_down</i></p>
</div>
<div class="mdui-panel-item-body"> </div>
</div>
</div>
<p><!-- /wp:mdx/fold --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">这里的第二个微妙之处是，我们使用RuleDelayed而不是Rule作为第一个(外部)规则。很容易看出，如果我们不这样做，就不会得到想要的结果</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
 f_[t__] /; f =!= List -&gt; (f[t] /. x -&gt; 10)</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x y, x + y, g[y, x], h[x, y, z], Cos[y]}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"> </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">原因是在规则的情况下，在替换规则之前要对规则的r.h.s.进行评估。回顾Mathematica求值的一般策略，内部规则将在外部规则之前求值(这是括号所确保的)。但是到那时，外部规则中的 t 仍然与列表中匹配的部分没有任何关系，只是保持 t 。因此，规则f[t] /.x -&gt; 10 完全空闲，计算结果为f[t]。这就产生了第一条规则f_[t__] /;f = != List -&gt;f[t]，它也是空闲的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:mdx/fold {"title":"step3,使用跟踪命令来确认"} --></p>
<div class="wp-block-mdx-fold mdui-panel mdui-panel-gapless">
<div class="mdui-panel-item">
<div class="mdui-panel-item-header">
<div class="mdui-panel-item-title">step3,使用跟踪命令来确认</div>
<p><i class="mdui-panel-item-arrow mdui-icon material-icons">keyboard_arrow_down</i></p>
</div>
<div class="mdui-panel-item-body"> </div>
</div>
</div>
<p><!-- /wp:mdx/fold --></p>
<p><!-- wp:code --></p>
<pre><code>{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
  f_[t__] /; f =!= List -&gt; (f[t] /. x -&gt; 10) // Trace</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{{{{x-&gt;10,x-&gt;10},f(t)/. x-&gt;10,f(t)},f_(t__)/;f=!=List-&gt;f(t),f_(t__)/;f=!=List-&gt;f(t)},{x,sin(x),x^2,x y,x+y,g(y,x),h(x,y,z),cos(y)}/. f_(t__)/;f=!=List-&gt;f(t),{List=!=List,False},{Sin=!=List,True},{Power=!=List,True},{Times=!=List,True},{Plus=!=List,True},{g=!=List,True},{h=!=List,True},{Cos=!=List,True},{x,sin(x),x^2,x y,x+y,g(y,x),h(x,y,z),cos(y)}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##FYqxDsIwEEN3vsJsBVoCrKgsrN1gO4UoqhqaoQW1N6Qgvv24LM/PsgfPfTd4jq0X@aYStzhSsiXS46TYLgrsoPGk7Lr0pDf1j/r1NdNifzB7rIDgiJ2zMGcE1OsaTZwZ1QVFILb5lHI7HjYwBvfJt52IVO8pjvwH" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">如果我们使用RuleDelayed, 外部规则(包括内部规则)的rhs将不会被计算，直到为外部规则找到一些匹配。这将允许内部规则通过外部规则匹配来 操作 表达式 。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4>1.2.4.11   Rule 比对 RuleDelayed 何时使用他们两个</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"customFontSize":18,"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em" style="font-size: 18px;"><strong>何时使用RuleDelayed更合适</strong></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">一般来说，<strong>在规则的r.h.s.不确定的情况下，使用RuleDelayed通常更安全。</strong></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">例如，<strong>如果模式定义标签(如fin f_ ， tint__等)具有任何全局值，我们刚才讨论的所有替换都将被完全破坏</strong>。例如，这是我们上面使用的规则之一，但是一些模式标签在应用规则之前有一些全局值:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>f = "Global Function";
t = "Global Value";
{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
 f_[t__] /; f =!= List -&gt; {{"function", f}, {"arguments", {t}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{x,{{function,Global Function},{arguments,{Global Value}}},{{function,Global Function},{arguments,{Global Value}}},{{function,Global Function},{arguments,{Global Value}}},{{function,Global Function},{arguments,{Global Value}}},{{function,Global Function},{arguments,{Global Value}}},{{function,Global Function},{arguments,{Global Value}}},{{function,Global Function},{arguments,{Global Value}}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">再说一次，这是因为在任何程序之前，规则的r.h.s.已经被评估过了。为了安全，使用规则延迟</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>f = "Global Function";
t = "Global Value";
{x, Sin[x], x^2, x*y, x + y, g[y, x], h[x, y, z], Cos[y]} /. 
 f_[t__] /; f =!= List :&gt; {{"function", f}, {"arguments", {t}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{x,{{function,Sin},{arguments,{x}}},{{function,Power},{arguments,{x,2}}},{{function,Times},{arguments,{x,y}}},{{function,Plus},{arguments,{x,y}}},{{function,g},{arguments,{y,x}}},{{function,h},{arguments,{x,y,z}}},{{function,Cos},{arguments,{y}}}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##TY3BCoJAFEX3fsVtlmUJLRPbBLVpF7QZTCZxdEDH0Cdow3z79FoEbe47nPvgdoqaqlNkShWCRgZxafunanGebEmmtyKN6E/fVTtV7Nwc42asnPMY82PPsV44sAGfWn6Zm0byG/Ob@dSPcsk9kh0i6EJSUeRIUvDoKsPVjITDEc4J/VuOoX0MJ9RQT11laWTjyHsfQti@BmPpAw" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4>何时使用Rule更合适</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">当然，在某些情况下必须使用Rule——这时规则的r.h.s.是一个常量。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">例如，假设我们想用半直线上的高斯函数的积分值来替换列表中的每个偶数。这是使用Rule所需的时间(对于列表的大小)</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>Range[50] /. _?EvenQ -&gt; Integrate[Exp[-x^2], {x, 0, Infinity}] // 
  Short // Timing
Range[50] /. _?EvenQ :&gt; Integrate[Exp[-x^2], {x, 0, Infinity}] // 
  Short // Timing</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:code --></p>
<pre><code>{0.234375,{1,Sqrt[\[Pi]]/2,3,Sqrt[\[Pi]]/2,5,&lt;&lt;40&gt;&gt;,Sqrt[\[Pi]]/2,47,Sqrt[\[Pi]]/2,49,Sqrt[\[Pi]]/2}}
{4.14063,{1,Sqrt[\[Pi]]/2,3,Sqrt[\[Pi]]/2,5,&lt;&lt;40&gt;&gt;,Sqrt[\[Pi]]/2,47,Sqrt[\[Pi]]/2,49,Sqrt[\[Pi]]/2}}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/z8oMS89NdrUIFZBX08h3t61LDUvUEHXTsEzryQ1vSixJDXataIgWrcizihWR6G6QkfBQAcol5aZl1lSWQvUpK/ApaAQnJFfVAJih2TmZual6@sHFGXmlXBhNduKKmb///9ftwDEAAA" target="_blank" rel="noopener">Try it online!</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"className":"is-style-text-indent-2em"} --></p>
<p class="is-style-text-indent-2em">这里所发生的是，在一种情况下，积分只计算一次，而在另一种情况下，它会一次又一次地重新计算。同样，这里的情况与立即分配和延迟分配的情况非常相似。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"customFontSize":30,"className":"is-style-text-indent-2em"} --></p>
<p><!-- /wp:paragraph --></p>

<!-- wp:heading {"level":4} -->
<h4>1.2.4.12测试表达式Head（头部）的模式</h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 让我们再次回到原来的表达式列表。我们也可以建立更严格的规则，只对某些函数起作用，例如: </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x*y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]} /. 
 f_Sin :> (f /. x -> 10)</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;10], x^2, x y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqINs5vzi6MrZWQV9PgUshLR6oWcHKTkEjDSRQoaBrp2BooPn//3/dgqLMvBIA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x*y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]} /. 
 f_Plus :> (f /. x -> 10)</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x y, 10 + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqINs5vzi6MrZWQV9PgUshLT4gp7RYwcpOQSMNJFKhoGunYGig@f//f92Cosy8EgA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x*y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]} /. 
 f_Power :> (f /. x -> 10)</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], 100, x y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqINs5vzi6MrZWQV9PgUshLT4gvzy1SMHKTkEjDSRUoaBrp2BooPn//3/dgqLMvBIA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 我们已经介绍了模式的另一个有用的部分——<strong>检查头部的部分</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">虽然严格地说，这些模式应该已经被认为是<strong>受限制的模式</strong>，而且我们还没有讨论这个主题，但是这种结构纯粹是形式上的，因此仍然适合我们目前的讨论。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">其思想是，<strong>模式x_head将匹配任何具有Head 的单个表达式 </strong></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>1.2.4.13 谈模式的一个陷阱 </h4>
<!-- /wp:heading -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 在第一种情况中，通过像上面那样编写模式，我们没有节省多少 代码</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x*y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]} /. 
 Sin&#91;x] :> Sin&#91;10]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;10], x^2, x y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqINs5vzi6MrZWQV9PgQuqVcHKDswyNIj9//@/bkFRZl4JAA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> 但在第二种情况下，我们掉入一个陷阱 </p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x*y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]} /. 
 Plus&#91;t__] :> (Plus&#91;t] /. x -> 10)</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{10, Sin&#91;10], 100, 10 y, 10 + y, g&#91;y, 10], h&#91;10, y, z], Cos&#91;y]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqINs5vzi6MrZWQV9PgUshIKe0OLokPj5WwcpOQQPCiwVJVSjo2ikYGmj@//9ft6AoM68EAA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">为什么会这样？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这种行为会给那些开始玩弄规则和模式的人带来噩梦。这超出了当前讨论的范围，但是这里所发生的是<strong>模式本身</strong>在<strong>匹配其原始形式之前进行了计算</strong>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">我们来看看这个Plus[t__]</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>Plus&#91;t__]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>t__</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/z8gp7Q4uiQ@Pvb///@6BUWZeSUA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">实际匹配的不是[wlinline]Plus[t__][/wlinline]而是[wlinline]t__[/wlinline]</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在这里:>(RuleDelayed)没有计算右边边的规则，但是很显然计算了做左边的规则.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">这个问题怎么解决呢？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">我们可以用[wlinline]HoldPattern[/wlinline]函数，让[wlinline]Plus[t__][/wlinline]不计算！</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x*y, x + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]} /. 
 HoldPattern&#91;Plus&#91;t__]] :> (Plus&#91;t] /. x -> 10)</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{x, Sin&#91;x], x^2, x y, 10 + y, g&#91;y, x], h&#91;x, y, z], Cos&#91;y]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/7@6QkchODMvuiJWR6EizghIaFUCCQVtBSCVHg1iA2UyooHKgOwqINs5vzi6MrZWQV9PgUvBIz8nJSCxpCS1KC86IKe0OLokPj42VsHKTkEDwo0FqatQ0LVTMDTQ/P//v25BUWZeCQA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">现在它和我们预期的很符合。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">同样的问题也出现在[wlinline]Power[/wlinline]函数上，这个函数也是先计算了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">同样的改正的办法是用[wlinline]HlodPattern[/wlinline]。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在这里我就不给出代码了，自己可以尝试一下。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">[wlinline]HoldPattern[/wlinline] 的用法和一些相关的东西，在后面会系统地介绍。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">回到我们现在的主题，我们可以看到x_head和head[x__]很像，但是又不完全是一样的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">1.2.4.14 BlankNullSequence：匹配任意数量元素的表达式</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"> x_head和head[x__] 的不等价来源于下面这个例子：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre><code>{f&#91;x],g&#91;x],f&#91;x,y],Sin&#91;x+y],f&#91;],f&#91;x,y,z]}/.f&#91;t__]:>a*f&#91;t]</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre><code>{a f&#91;x], g&#91;x], a f&#91;x, y], Sin&#91;x + y], f&#91;], a f&#91;x, y, z]}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em"><a href="https://tio.run/##y00syUjNTSzJTE78/786LboiVicdRABZOpWxOsGZedEV2pUgPlRMpyq2Vl8vLbokPj7Wyi5RC8iK/f//v25BUWZeCQA" target="_blank" rel="noopener">Try it online!</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">在这里，我们需要表达式替换成头部是 \(\displaystyle{f}\) 和 \(a\)  相乘的样子</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"className":"is-style-text-indent-2em"} -->
<p class="is-style-text-indent-2em">然后</p>
<!-- /wp:paragraph -->
            </div>
            <hr/>

            

    <div class="reprint" id="reprint-statement">
        
            <div class="reprint__author">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-user">
                        文章作者:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://wxyhgk.gitee.io" rel="external nofollow noreferrer">我心永恆</a>
                </span>
            </div>
            <div class="reprint__type">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-link">
                        文章链接:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://wxyhgk.gitee.io/mma-rulepatten1/">https://wxyhgk.gitee.io/mma-rulepatten1/</a>
                </span>
            </div>
            <div class="reprint__notice">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-copyright">
                        版权声明:
                    </i>
                </span>
                <span class="reprint-info">
                    本博客所有文章除特別声明外，均采用
                    <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a>
                    许可协议。转载请注明来源
                    <a href="https://wxyhgk.gitee.io" target="_blank">我心永恆</a>
                    !
                </span>
            </div>
        
    </div>

    <script async defer>
      document.addEventListener("copy", function (e) {
        let toastHTML = '<span>复制成功，请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>';
        M.toast({html: toastHTML})
      });

      function navToReprintStatement() {
        $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800);
      }
    </script>



            <div class="tag_share" style="display: block;">
                <div class="post-meta__tag-list" style="display: inline-block;">
                    
                        <div class="article-tag">
                            
                                <a href="/tags/%E6%95%99%E7%A8%8B/">
                                    <span class="chip bg-color">教程</span>
                                </a>
                            
                                <a href="/tags/Mathematica/">
                                    <span class="chip bg-color">Mathematica</span>
                                </a>
                            
                        </div>
                    
                </div>
                <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;">
                    <link rel="stylesheet" type="text/css" href="/libs/share/css/share.min.css">

<div id="article-share">
    
    
    <div class="social-share" data-sites="qq,qzone,wechat,weibo,douban" data-wechat-qrcode-helper="<p>微信扫一扫即可分享！</p>"></div>
    <script src="/libs/share/js/social-share.min.js"></script>
    

    

</div>

                </div>
            </div>
            
                <style>
    #reward {
        margin: 40px 0;
        text-align: center;
    }

    #reward .reward-link {
        font-size: 1.4rem;
        line-height: 38px;
    }

    #reward .btn-floating:hover {
        box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2), 0 5px 15px rgba(0, 0, 0, 0.2);
    }

    #rewardModal {
        width: 320px;
        height: 350px;
    }

    #rewardModal .reward-title {
        margin: 15px auto;
        padding-bottom: 5px;
    }

    #rewardModal .modal-content {
        padding: 10px;
    }

    #rewardModal .close {
        position: absolute;
        right: 15px;
        top: 15px;
        color: rgba(0, 0, 0, 0.5);
        font-size: 1.3rem;
        line-height: 20px;
        cursor: pointer;
    }

    #rewardModal .close:hover {
        color: #ef5350;
        transform: scale(1.3);
        -moz-transform:scale(1.3);
        -webkit-transform:scale(1.3);
        -o-transform:scale(1.3);
    }

    #rewardModal .reward-tabs {
        margin: 0 auto;
        width: 210px;
    }

    .reward-tabs .tabs {
        height: 38px;
        margin: 10px auto;
        padding-left: 0;
    }

    .reward-content ul {
        padding-left: 0 !important;
    }

    .reward-tabs .tabs .tab {
        height: 38px;
        line-height: 38px;
    }

    .reward-tabs .tab a {
        color: #fff;
        background-color: #ccc;
    }

    .reward-tabs .tab a:hover {
        background-color: #ccc;
        color: #fff;
    }

    .reward-tabs .wechat-tab .active {
        color: #fff !important;
        background-color: #22AB38 !important;
    }

    .reward-tabs .alipay-tab .active {
        color: #fff !important;
        background-color: #019FE8 !important;
    }

    .reward-tabs .reward-img {
        width: 210px;
        height: 210px;
    }
</style>

<div id="reward">
    <a href="#rewardModal" class="reward-link modal-trigger btn-floating btn-medium waves-effect waves-light red">赏</a>

    <!-- Modal Structure -->
    <div id="rewardModal" class="modal">
        <div class="modal-content">
            <a class="close modal-close"><i class="fas fa-times"></i></a>
            <h4 class="reward-title">你的赏识是我前进的动力</h4>
            <div class="reward-content">
                <div class="reward-tabs">
                    <ul class="tabs row">
                        <li class="tab col s6 alipay-tab waves-effect waves-light"><a href="#alipay">支付宝</a></li>
                        <li class="tab col s6 wechat-tab waves-effect waves-light"><a href="#wechat">微 信</a></li>
                    </ul>
                    <div id="alipay">
                        <img src="/medias/reward/alipay.jpg" class="reward-img" alt="支付宝打赏二维码">
                    </div>
                    <div id="wechat">
                        <img src="/medias/reward/wechat.png" class="reward-img" alt="微信打赏二维码">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    $(function () {
        $('.tabs').tabs();
    });
</script>
            
        </div>
    </div>

    

    

    

    

    
        <style>
    .valine-card {
        margin: 1.5rem auto;
    }

    .valine-card .card-content {
        padding: 20px 20px 5px 20px;
    }

    #vcomments textarea {
        box-sizing: border-box;
        background: url("/medias/comment_bg.png") 100% 100% no-repeat;
    }

    #vcomments p {
        margin: 2px 2px 10px;
        font-size: 1.05rem;
        line-height: 1.78rem;
    }

    #vcomments blockquote p {
        text-indent: 0.2rem;
    }

    #vcomments a {
        padding: 0 2px;
        color: #4cbf30;
        font-weight: 500;
        text-decoration: none;
    }

    #vcomments img {
        max-width: 100%;
        height: auto;
        cursor: pointer;
    }

    #vcomments ol li {
        list-style-type: decimal;
    }

    #vcomments ol,
    ul {
        display: block;
        padding-left: 2em;
        word-spacing: 0.05rem;
    }

    #vcomments ul li,
    ol li {
        display: list-item;
        line-height: 1.8rem;
        font-size: 1rem;
    }

    #vcomments ul li {
        list-style-type: disc;
    }

    #vcomments ul ul li {
        list-style-type: circle;
    }

    #vcomments table, th, td {
        padding: 12px 13px;
        border: 1px solid #dfe2e5;
    }

    #vcomments table, th, td {
        border: 0;
    }

    table tr:nth-child(2n), thead {
        background-color: #fafafa;
    }

    #vcomments table th {
        background-color: #f2f2f2;
        min-width: 80px;
    }

    #vcomments table td {
        min-width: 80px;
    }

    #vcomments h1 {
        font-size: 1.85rem;
        font-weight: bold;
        line-height: 2.2rem;
    }

    #vcomments h2 {
        font-size: 1.65rem;
        font-weight: bold;
        line-height: 1.9rem;
    }

    #vcomments h3 {
        font-size: 1.45rem;
        font-weight: bold;
        line-height: 1.7rem;
    }

    #vcomments h4 {
        font-size: 1.25rem;
        font-weight: bold;
        line-height: 1.5rem;
    }

    #vcomments h5 {
        font-size: 1.1rem;
        font-weight: bold;
        line-height: 1.4rem;
    }

    #vcomments h6 {
        font-size: 1rem;
        line-height: 1.3rem;
    }

    #vcomments p {
        font-size: 1rem;
        line-height: 1.5rem;
    }

    #vcomments hr {
        margin: 12px 0;
        border: 0;
        border-top: 1px solid #ccc;
    }

    #vcomments blockquote {
        margin: 15px 0;
        border-left: 5px solid #42b983;
        padding: 1rem 0.8rem 0.3rem 0.8rem;
        color: #666;
        background-color: rgba(66, 185, 131, .1);
    }

    #vcomments pre {
        font-family: monospace, monospace;
        padding: 1.2em;
        margin: .5em 0;
        background: #272822;
        overflow: auto;
        border-radius: 0.3em;
        tab-size: 4;
    }

    #vcomments code {
        font-family: monospace, monospace;
        padding: 1px 3px;
        font-size: 0.92rem;
        color: #e96900;
        background-color: #f8f8f8;
        border-radius: 2px;
    }

    #vcomments pre code {
        font-family: monospace, monospace;
        padding: 0;
        color: #e8eaf6;
        background-color: #272822;
    }

    #vcomments pre[class*="language-"] {
        padding: 1.2em;
        margin: .5em 0;
    }

    #vcomments code[class*="language-"],
    pre[class*="language-"] {
        color: #e8eaf6;
    }

    #vcomments [type="checkbox"]:not(:checked), [type="checkbox"]:checked {
        position: inherit;
        margin-left: -1.3rem;
        margin-right: 0.4rem;
        margin-top: -1px;
        vertical-align: middle;
        left: unset;
        visibility: visible;
    }

    #vcomments b,
    strong {
        font-weight: bold;
    }

    #vcomments dfn {
        font-style: italic;
    }

    #vcomments small {
        font-size: 85%;
    }

    #vcomments cite {
        font-style: normal;
    }

    #vcomments mark {
        background-color: #fcf8e3;
        padding: .2em;
    }

    #vcomments table, th, td {
        padding: 12px 13px;
        border: 1px solid #dfe2e5;
    }

    table tr:nth-child(2n), thead {
        background-color: #fafafa;
    }

    #vcomments table th {
        background-color: #f2f2f2;
        min-width: 80px;
    }

    #vcomments table td {
        min-width: 80px;
    }

    #vcomments [type="checkbox"]:not(:checked), [type="checkbox"]:checked {
        position: inherit;
        margin-left: -1.3rem;
        margin-right: 0.4rem;
        margin-top: -1px;
        vertical-align: middle;
        left: unset;
        visibility: visible;
    }
</style>

<div class="card valine-card" data-aos="fade-up">
    <div class="comment_headling" style="font-size: 20px; font-weight: 700; position: relative; left: 20px; top: 15px; padding-bottom: 5px;">
        <i class="fas fa-comments fa-fw" aria-hidden="true"></i>
        <span>评论</span>
    </div>
    <div id="vcomments" class="card-content" style="display: grid">
    </div>
</div>

<script src="/libs/valine/av-min.js"></script>
<script src="/libs/valine/Valine.min.js"></script>
<script>
    new Valine({
        el: '#vcomments',
        appId: '8i5IVUkUwJXeA2lmcXHA1oya-gzGzoHsz',
        appKey: '8VLP3WBVp7k20K81z9qUxg1i',
        notify: 'false' === 'true',
        verify: 'false' === 'true',
        visitor: 'true' === 'true',
        avatar: 'mm',
        pageSize: '10',
        lang: 'zh-cn',
        placeholder: 'just go go'
    });
</script>

    

    

<article id="prenext-posts" class="prev-next articles">
    <div class="row article-row">
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge left-badge text-color">
                <i class="fas fa-chevron-left"></i>&nbsp;上一篇</div>
            <div class="card">
                <a href="/mma-list/">
                    <div class="card-image">
                        
                        
                        <img src="/medias/featureimages/20.jpg" class="responsive-img" alt="Mathematica——列表操作">
                        
                        <span class="card-title">Mathematica——列表操作</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                             1.1介绍 



在Mathematica中，列表是主要的数据结构，在LISP等函数式编程语言中也是如此。任何复杂的数据结构都可以表示为一些(可能是复杂的和嵌套的)列表。例如，n维数组表示为深度为n的列表。



列表可以在程序执行过程
                        
                    </div>
                    <div class="publish-info">
                        <span class="publish-date">
                            <i class="far fa-clock fa-fw icon-date"></i>2020-03-14
                        </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-user fa-fw"></i>
                            我心永恆
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/tags/%E6%95%99%E7%A8%8B/">
                        <span class="chip bg-color">教程</span>
                    </a>
                    
                    <a href="/tags/Mathematica/">
                        <span class="chip bg-color">Mathematica</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge right-badge text-color">
                下一篇&nbsp;<i class="fas fa-chevron-right"></i>
            </div>
            <div class="card">
                <a href="/mma-base2Dplot3/">
                    <div class="card-image">
                        
                        
                        <img src="/medias/featureimages/20.jpg" class="responsive-img" alt="Mathematica——画图3">
                        
                        <span class="card-title">Mathematica——画图3</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            在一个网格中显示多个图形问题为了便于比较，你可能需要显示几个相关的图形在一个网格中。
解决方案使用GraphicsGrid在mathematica6或GraphicsArray在较早的版本。您可以使用表来将几个图形分组在一起，但这使你几乎无
                        
                    </div>
                    <div class="publish-info">
                            <span class="publish-date">
                                <i class="far fa-clock fa-fw icon-date"></i>2020-03-13
                            </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-user fa-fw"></i>
                            我心永恆
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/tags/%E6%95%99%E7%A8%8B/">
                        <span class="chip bg-color">教程</span>
                    </a>
                    
                    <a href="/tags/Mathematica/">
                        <span class="chip bg-color">Mathematica</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
    </div>
</article>

</div>



<!-- 代码块功能依赖 -->
<script type="text/javascript" src="/libs/codeBlock/codeBlockFuction.js"></script>

<!-- 代码语言 -->

<script type="text/javascript" src="/libs/codeBlock/codeLang.js"></script>


<!-- 代码块复制 -->

<script type="text/javascript" src="/libs/codeBlock/codeCopy.js"></script>


<!-- 代码块收缩 -->


<!-- 代码块折行 -->


    </div>
    <div id="toc-aside" class="expanded col l3 hide-on-med-and-down">
        <div class="toc-widget">
            <div class="toc-title"><i class="far fa-list-alt"></i>&nbsp;&nbsp;目录</div>
            <div id="toc-content"></div>
        </div>
    </div>
</div>

<!-- TOC 悬浮按钮. -->

<div id="floating-toc-btn" class="hide-on-med-and-down">
    <a class="btn-floating btn-large bg-color">
        <i class="fas fa-list-ul"></i>
    </a>
</div>


<script src="/libs/tocbot/tocbot.min.js"></script>
<script>
    $(function () {
        tocbot.init({
            tocSelector: '#toc-content',
            contentSelector: '#articleContent',
            headingsOffset: -($(window).height() * 0.4 - 45),
            collapseDepth: Number('2'),
            headingSelector: 'h2, h3, h4, h5, h6'
        });

        // modify the toc link href to support Chinese.
        let i = 0;
        let tocHeading = 'toc-heading-';
        $('#toc-content a').each(function () {
            $(this).attr('href', '#' + tocHeading + (++i));
        });

        // modify the heading title id to support Chinese.
        i = 0;
        $('#articleContent').children('h2, h3, h4, h5, h6').each(function () {
            $(this).attr('id', tocHeading + (++i));
        });

        // Set scroll toc fixed.
        let tocHeight = parseInt($(window).height() * 0.4 - 64);
        let $tocWidget = $('.toc-widget');
        $(window).scroll(function () {
            let scroll = $(window).scrollTop();
            /* add post toc fixed. */
            if (scroll > tocHeight) {
                $tocWidget.addClass('toc-fixed');
            } else {
                $tocWidget.removeClass('toc-fixed');
            }
        });

        
        /* 修复文章卡片 div 的宽度. */
        let fixPostCardWidth = function (srcId, targetId) {
            let srcDiv = $('#' + srcId);
            if (srcDiv.length === 0) {
                return;
            }

            let w = srcDiv.width();
            if (w >= 450) {
                w = w + 21;
            } else if (w >= 350 && w < 450) {
                w = w + 18;
            } else if (w >= 300 && w < 350) {
                w = w + 16;
            } else {
                w = w + 14;
            }
            $('#' + targetId).width(w);
        };

        // 切换TOC目录展开收缩的相关操作.
        const expandedClass = 'expanded';
        let $tocAside = $('#toc-aside');
        let $mainContent = $('#main-content');
        $('#floating-toc-btn .btn-floating').click(function () {
            if ($tocAside.hasClass(expandedClass)) {
                $tocAside.removeClass(expandedClass).hide();
                $mainContent.removeClass('l9');
            } else {
                $tocAside.addClass(expandedClass).show();
                $mainContent.addClass('l9');
            }
            fixPostCardWidth('artDetail', 'prenext-posts');
        });
        
    });
</script>

    

</main>


<script src="https://cdn.bootcss.com/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script>
    MathJax.Hub.Config({
        tex2jax: {inlineMath: [['$', '$'], ['\(', '\)']]}
    });
</script>


    <footer class="page-footer bg-color">
    
    <div class="container row center-align" style="margin-bottom: 0px !important;">
        <div class="col s12 m8 l8 copy-right">
            Copyright&nbsp;&copy;
            <span id="year">2019</span>
            <a href="https://wxyhgk.gitee.io" target="_blank">我心永恆</a>
            |&nbsp;Powered by&nbsp;<a href="https://hexo.io/" target="_blank">Hexo</a>
            |&nbsp;Theme&nbsp;<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a>
            <br>
            
            &nbsp;<i class="fas fa-chart-area"></i>&nbsp;站点总字数:&nbsp;<span
                class="white-color">43.3k</span>&nbsp;字
            
            
            
            
            
            
            <span id="busuanzi_container_site_pv">
                |&nbsp;<i class="far fa-eye"></i>&nbsp;总访问量:&nbsp;<span id="busuanzi_value_site_pv"
                    class="white-color"></span>&nbsp;次
            </span>
            
            
            <span id="busuanzi_container_site_uv">
                |&nbsp;<i class="fas fa-users"></i>&nbsp;总访问人数:&nbsp;<span id="busuanzi_value_site_uv"
                    class="white-color"></span>&nbsp;人
            </span>
            
            <br>
            
            <br>
            
        </div>
        <div class="col s12 m4 l4 social-link social-statis">


    <a href="mailto:3123624718@qq.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50">
        <i class="fas fa-envelope-open"></i>
    </a>







    <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=3123624718" class="tooltipped" target="_blank" data-tooltip="QQ联系我: 3123624718" data-position="top" data-delay="50">
        <i class="fab fa-qq"></i>
    </a>







</div>
    </div>
    <script src="/js/highlight.pack.js"></script>
    <script>hljs.initHighlightingOnLoad();</script>
</footer>

<div class="progress-bar"></div>


    <!-- 搜索遮罩框 -->
<div id="searchModal" class="modal">
    <div class="modal-content">
        <div class="search-header">
            <span class="title"><i class="fas fa-search"></i>&nbsp;&nbsp;搜索</span>
            <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字"
                   class="search-input">
        </div>
        <div id="searchResult"></div>
    </div>
</div>

<script src="/js/search.js"></script>
<script type="text/javascript">
$(function () {
    searchFunc("/" + "search.xml", 'searchInput', 'searchResult');
});
</script>
    <!-- 回到顶部按钮 -->
<div id="backTop" class="top-scroll">
    <a class="btn-floating btn-large waves-effect waves-light" href="#!">
        <i class="fas fa-arrow-up"></i>
    </a>
</div>


    <script src="/libs/materialize/materialize.min.js"></script>
    <script src="/libs/masonry/masonry.pkgd.min.js"></script>
    <script src="/libs/aos/aos.js"></script>
    <script src="/libs/scrollprogress/scrollProgress.min.js"></script>
    <script src="/libs/lightGallery/js/lightgallery-all.min.js"></script>
    <script src="/js/matery.js"></script>

    <!-- Baidu Analytics -->

    <!-- Baidu Push -->

<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        } else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>

    
    <script src="/libs/others/clicklove.js" async="async"></script>
    
    
    <script async src="/libs/others/busuanzi.pure.mini.js"></script>
    

    

    

    
    <script type="text/javascript" color="0,0,255"
        pointColor="0,0,255" opacity='0.7'
        zIndex="-1" count="99"
        src="/libs/background/canvas-nest.js"></script>
    

    

    
    
    
    <script src="/libs/instantpage/instantpage.js" type="module"></script>
    

</body>

</html>
